#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int s[10][10], flip[10][10], opt[10][10];
int dir[5][2] = {{-1, 0}, {1, 0}, {0, 0}, {0, -1}, {0, 1}};
int cal();
int get(int x, int y);

int main()
{
    int n, ncase = 1;
    scanf("%d", &n);
    while (n--)
    {
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                scanf("%d", &s[i][j]);
            }
        }
        int res = -1;
        for (int i = 0; i < 1 << 6; i++)
        {
            memset(flip, 0, sizeof(flip));
            for (int j = 0; j < 6; j++)
            {
                flip[0][6 - j - 1] = (i >> j) & 1;
            }
            int num = cal();
            if ((res == -1 || res > num) && num >= 0)
            {
                res = num;
                memcpy(opt, flip, sizeof(flip));
            }
        }
        printf("PUZZLE #%d\n", ncase++);
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                printf("%d%c", opt[i][j], j == 5 ? '\n' : ' ');
            }
        }
    }
    return 0;
}

int cal()
{
    for (int i = 1; i < 5; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            if (get(i - 1, j) % 2 != 0)
            {
                flip[i][j] = 1;
            }
        }
    }
    for (int i = 0; i < 6; i++)
    {
        if (get(4, i) % 2 != 0)
        {
            return -1;
        }
    }
    int num = 0;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            num += flip[i][j];
        }
    }
    return num;
}

int get(int x, int y)
{
    int num = s[x][y];
    for (int i = 0; i < 5; i++)
    {
        int a = dir[i][0] + x, b = dir[i][1] + y;
        if (a >= 0 && a < 5 && b >= 0 && b < 6)
        {
            num += flip[a][b];
        }
    }
    return num;
}